package View;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import Pojo.Aluno;
import Pojo.Atividade;
import Pojo.Disciplina;
import Pojo.Historico;
import Pojo.HistoricoTurma;
import Pojo.Turma;
import View.MenuAtividade.Comparador;
import DAO.AlunoDaoImplArquivo;
import DAO.DisciplinaDaoImplArquivo;
import DAO.HistoricoDao;
import DAO.HistoricoDaoImplArquivo;
import DAO.HistoricoTurmaDaoImplArquivo;
import DAO.TurmaDaoImplArquivo;

/** Classe de operações referentes às disciplinas.
*
* @author Thiago Schons
* 
* */
public class MenuDisciplina {

	/**
	 * Classe comparador para ordenar as disciplinas
	 * @author Thiago Schons
	 *
	 */
	public class Comparador implements Comparator<Disciplina>{
		/**
		 * Método de comparação que implementa o método de Comparator
		 */
		public int compare(Disciplina disciplina1, Disciplina disciplina2){
			return disciplina1.getNome().compareTo(disciplina2.getNome());
		}
	}
	
	/**Método para cadastro de disciplinas.
	 * 
	 * @param disciplinaDao
	 */
	public void cadastrarDisciplinas(DisciplinaDaoImplArquivo disciplinaDao){
		System.out.println("-----Cadastrando Nova Disciplina-----");
		int continuar=1;
		while(continuar==1){
			int idDisciplina = disciplinaDao.getProximoId();
			
			System.out.println("Informe o nome da Disciplina: ");
			String nome = Console.readString();
			
			System.out.println("Informe a ementa da Disciplina, separando os tópicos por vírgula: ");
			String ementa = Console.readString();
			
			System.out.println("Informe a carga Horária em horas da Disciplina: ");
			Integer cargaHoraria = Console.readInteger();
			
			List<Turma> listaTurma = new ArrayList<Turma>();
			
			List<Historico> listaHistorico = new ArrayList<Historico>();
			
			Disciplina novaDisciplina = new Disciplina(idDisciplina,nome,ementa,cargaHoraria,listaTurma,listaHistorico);
			disciplinaDao.adicionarDisciplina(novaDisciplina);
			
			System.out.println("Deseja cadastrar mais uma Disciplina? (1-Sim, 0-Não)");
			continuar = Console.readInteger();
		}
	}
	
	/**Método para escolha de disciplina.
	 * 
	 * @param disciplinaDao
	 */
	public int escolherDisciplinas(DisciplinaDaoImplArquivo disciplinaDao){
		System.out.println("---Escolha a Disciplina---");
		
		List<Disciplina> listaDisciplina = disciplinaDao.getListaDisciplina();
		Iterator<Disciplina> i = listaDisciplina.iterator();
		Disciplina disciplina;
		while(i.hasNext()){
			disciplina = (Disciplina) i.next();
			System.out.println(disciplina.getIdDisciplina() + " - "+ disciplina.getNome());
		}
		return(listaDisciplina.size());
	}
	
	/**Listagem de disciplinas.
	 * 
	 * @param disciplinaDao
	 */
	public void listarDisciplinas(DisciplinaDaoImplArquivo disciplinaDao){
		System.out.println("---Lista de Disciplinas---");
		
		List<Disciplina> listaDisciplinas = disciplinaDao.getListaDisciplina();
		Comparador comparador = new Comparador();
		Collections.sort(listaDisciplinas,comparador);
		
		Iterator<Disciplina> i = listaDisciplinas.iterator();
		Disciplina disciplina;
		System.out.println("Nome | Ementa | Carga Horária");
		while(i.hasNext()){
			disciplina = (Disciplina) i.next();
			System.out.println(disciplina.getNome()+ " | " + disciplina.getEmenta()+ " | " + disciplina.getCargaHoraria());
		}
		System.out.println("Pressione enter para retornar.");
		Console.readString();
	}
	
	/**Consulta de situação do aluno na Disciplina.
	 * 
	 * @param disciplinaDao
	 * @param alunoDao
	 * @param historicoDao
	 * @param historicoTurmaDao
	 */
	public void consultarSituacaoAluno(DisciplinaDaoImplArquivo disciplinaDao, AlunoDaoImplArquivo alunoDao, HistoricoDaoImplArquivo historicoDao, HistoricoTurmaDaoImplArquivo historicoTurmaDao){
		System.out.println("----- Consultando Situação Aluno -----");
		int idDisciplina;
		int idAluno;
		
		int continuarDisciplina = 1;
		while(continuarDisciplina==1){
			//Requisitando a Disciplina 
			this.escolherDisciplinas(disciplinaDao);
			idDisciplina = Console.readInteger();
			Disciplina disciplina = disciplinaDao.procurarPorId(idDisciplina);
			while (disciplina == null){
				System.out.println("Entrada inválida. Informe novamente:");
				idDisciplina = Console.readInteger();
				disciplina = disciplinaDao.procurarPorId(idDisciplina);
			}
			
			int continuarAluno = 1;
			while(continuarAluno==1){
				//Requisitando o Aluno
				MenuAluno menuAluno = new MenuAluno();
				menuAluno.escolherAlunos(alunoDao);
				idAluno = Console.readInteger();
				Aluno aluno = alunoDao.procurarPorId(idAluno);
				while (aluno == null){
					System.out.println("Entrada inválida. Informe novamente:");
					idAluno = Console.readInteger();
					aluno = alunoDao.procurarPorId(idAluno);
				}
				
				Historico historico = historicoDao.procurarPorAlunoEDisciplina(idAluno, idDisciplina);
				if (historico!=null){
					System.out.println("A disciplina "+disciplina.getNome()+" já foi cursada pelo aluno "+aluno.getNome()+" com aprovação.");
					System.out.println("Dados do aluno "+aluno.getNome()+" na disciplina "+disciplina.getNome());
					System.out.println("Nota Final: "+historico.getNotaFinal());
					System.out.println("Faltas: "+historico.getNumeroDeFaltas());
				}else{
					List<Turma> listaTurmas = disciplina.getTurmas();
					Iterator<Turma> i = listaTurmas.iterator();
					Turma turma;
					HistoricoTurma historicoTurma;
					while(i.hasNext()){
						turma = (Turma) i.next();
						historicoTurma = historicoTurmaDao.procurarPorAlunoETurma(aluno, turma);
						if ((historicoTurma!=null)&&(turma.getFinalizada()==false)){
							System.out.println("Aluno "+aluno.getNome()+" está cursando a disciplina "+disciplina.getNome()+" no momento pela turma "+turma.getAno()+", "+turma.getPeriodo());
						}else if ((historicoTurma!=null)&&(turma.getFinalizada()==true)){
							System.out.println("A disciplina "+disciplina.getNome()+" já foi cursada pelo aluno "+aluno.getNome()+" com reprovação.");
							System.out.println("Seus resultados foram os seguintes: ");
							System.out.println("Nota: "+historicoTurma.getNota());
							System.out.println("Faltas: "+historicoTurma.getNumeroDeFaltas());
						}else{
							System.out.println("O aluno "+aluno.getNome()+" nunca cursou a disciplina "+ disciplina.getNome());
						}
					}
				}
				
				System.out.println("Deseja consultar outro aluno? (1-Sim, 0-Não)");
				continuarAluno = Console.readInteger();
			}
			
			System.out.println("Deseja consultar outra disciplina? (1-Sim, 0-Não)");
			continuarDisciplina = Console.readInteger();
			
		}
		
	}
	
	/**Cálculo de número de turmas oferecidas para uma disciplina.
	 * 
	 * @param disciplinaDao
	 * @param turmaDao
	 */
	public void calcularQtdTurmasParaDisciplina(DisciplinaDaoImplArquivo disciplinaDao, TurmaDaoImplArquivo turmaDao){
		System.out.println("----- Cálculo do número de Turmas Para Uma Disciplina -----");
		int idDisciplina;
		int continuar=1;
		
		while(continuar==1){
			//Requisitando a Disciplina 
			if (this.escolherDisciplinas(disciplinaDao)==0){
				System.out.println("Nenhuma Disciplina para ser consultada.");
				Console.readString();
				break;
			}
			idDisciplina = Console.readInteger();
			Disciplina disciplina = disciplinaDao.procurarPorId(idDisciplina);
			while (disciplina == null){
				System.out.println("Entrada inválida. Informe novamente:");
				idDisciplina = Console.readInteger();
				disciplina = disciplinaDao.procurarPorId(idDisciplina);
			}
			
			List<Turma> listaTurmas = disciplina.getTurmas();
			System.out.println("Já foram oferecidas "+listaTurmas.size()+" turma(s) para a disciplina "+disciplina.getNome());
			
			System.out.println("\nDeseja calcular a quantidade de turmas para uma nova disciplina?(1-Sim, 0-Não)");
			continuar = Console.readInteger();
		}
	}
	
}
